/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.tools.idea.gradle.structure.configurables.ui.properties

import com.android.tools.idea.gradle.structure.model.PsVariablesScope
import com.android.tools.idea.gradle.structure.model.meta.ModelPropertyContext
import com.android.tools.idea.gradle.structure.model.meta.ModelPropertyCore
import com.intellij.ui.components.JBLabel
import java.awt.Font
import javax.swing.JComponent

abstract class PropertyEditorBase<out ModelPropertyT : ModelPropertyCore<*>, ValueT : Any>(
  val property: ModelPropertyT,
  val propertyContext: ModelPropertyContext<ValueT>,
  protected val variablesScope: PsVariablesScope?
) {

  abstract val component: JComponent

  val labelComponent: JBLabel by lazy(LazyThreadSafetyMode.NONE) {
    JBLabel(property.description).also {
      it.labelFor = component
      it.isFocusable = false
    }
  }

  protected fun updateModified() {
    labelComponent.font = labelComponent.font.let {
      if (property.isModified == true) it.deriveFont(it.style or Font.BOLD) else it.deriveFont(it.style and Font.BOLD.inv())
    }
  }
}
